﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Resources;
using Cesave.Domain.Core;
using System.Data;
using Cesave.Domain.PermisosModule.Entities;

namespace Cesave.Domain.PermisosModule.Contracts.Secciones
{
	/// <summary>
	/// 
	/// </summary>
	public class SeccionService
		: ISeccionService
	{
		#region Private properties

		/// <summary>
		/// 
		/// </summary>
		private ISeccionRepository _seccionRepository;

		#endregion

		#region Constructor

		/// <summary>
		/// 
		/// </summary>
		/// <param name="seccionRepository"></param>
		public SeccionService(ISeccionRepository seccionRepository)
		{
			if (seccionRepository == null)
				throw new ArgumentNullException(Messages.exception_DependenciesAreNotInitialized, "seccionRepository");
			_seccionRepository = seccionRepository;
		}

		#endregion

		#region ISeccionService Members

		/// <summary>
		/// 
		/// </summary>
		/// <param name="seccion"></param>
		public void AddSeccion(Entities.Seccion seccion)
		{
			if (seccion == null)
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "seccion");
			IUnitOfWork unitOfWork = _seccionRepository.StoreContext;
			_seccionRepository.Add(seccion);
			try
			{
				unitOfWork.Commit();
			}
			catch (OptimisticConcurrencyException)
			{
				unitOfWork.RollbackChanges();
				unitOfWork.CommitAndRefreshChanges();
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="seccion"></param>
		public void ChangeSeccion(Entities.Seccion seccion)
		{
			if (seccion == null)
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "seccion");
			IUnitOfWork unitOfWork = _seccionRepository.StoreContext;
			_seccionRepository.Modify(seccion);
			try
			{
				unitOfWork.Commit();
			}
			catch (OptimisticConcurrencyException)
			{
				unitOfWork.RollbackChanges();
				unitOfWork.CommitAndRefreshChanges();
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="moduloGuid"></param>
		/// <returns></returns>
		public List<Entities.Seccion> FindSeccionesByModulo(Guid moduloGuid)
		{
			if (moduloGuid == Guid.Empty)
				throw new ArgumentException(Messages.exception_InvalidArgument, "moduloGuid");
			SeccionesByModuleSpecification seccionesByModuloSpecification = new SeccionesByModuleSpecification(moduloGuid);
			return _seccionRepository.FindSeccionesByModulo(seccionesByModuloSpecification).ToList();
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="moduloGuid"></param>
		/// <param name="status"></param>
		/// <returns></returns>
		public List<Entities.Seccion> FindSeccionesByModuloAndStatus(Guid moduloGuid, bool status = true)
		{
			if (moduloGuid == Guid.Empty)
				throw new ArgumentException(Messages.exception_InvalidArgument, "moduloGuid");
			SeccionesByModuleSpecification seccionesByModuloSpecification = new SeccionesByModuleSpecification(moduloGuid);
			SeccionesByStatusSpecification seccionesByStatusSpecification = new SeccionesByStatusSpecification(status);
			return _seccionRepository.FindSeccionesByModuloAndStatus(seccionesByModuloSpecification, seccionesByStatusSpecification).ToList();
		}

        /// <summary>
        /// 
        /// </summary>
        /// <param name="juntaGuid"></param>
        /// <returns></returns>
        public List<Entities.Seccion> FindSeccionesByJunta(Guid juntaGuid)
        {
            if (juntaGuid == Guid.Empty)
                throw new ArgumentException(Messages.exception_InvalidArgument, "juntaGuid");
            SeccionesByJuntaSpecificacion specification = new SeccionesByJuntaSpecificacion(juntaGuid);
            return _seccionRepository.FindSeccionesByJunta(specification).ToList();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="seccionGuid"></param>
        /// <returns></returns>
        public Seccion FindSeccionByGuid(Guid seccionGuid)
        {
            if (seccionGuid == Guid.Empty)
                throw new ArgumentException(Messages.exception_InvalidArgument, "seccionGuid");
            return _seccionRepository.GetBySpec(new SeccionByGuidSpecification(seccionGuid)).FirstOrDefault();
        }

		#endregion

		#region IDisposable Members

		public void Dispose()
		{
			if (_seccionRepository != null && _seccionRepository.StoreContext != null)
				_seccionRepository.StoreContext.Dispose();
		}

		#endregion
    }
}